/********************************************************************
 *                                                                  *
 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
 *                                                                  *
 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
 * by the XIPHOPHORUS Company http://www.xiph.org/                  *
 *                                                                  *
 ********************************************************************

 function: libvorbis codec headers
 last mod: $Id: codec_internal.h,v 1.17 2003/08/18 05:34:01 xiphmont Exp $

 ********************************************************************/

#ifndef _V_CODECI_H_
#define _V_CODECI_H_

#include "envelope.h"
#include "codebook.h"

#define BLOCKTYPE_IMPULSE    0
#define BLOCKTYPE_PADDING    1
#define BLOCKTYPE_TRANSITION 0
#define BLOCKTYPE_LONG       1

#define PACKETBLOBS 15

typedef struct vorbis_block_internal
{
	float**  pcmdelay;  /* this is a pointer into local storage */
	float  ampmax;
	int    blocktype;

	ogg_uint32_t   packetblob_markers[PACKETBLOBS];
} vorbis_block_internal;

typedef void vorbis_look_floor;
typedef void vorbis_look_residue;
typedef void vorbis_look_transform;

/* mode ************************************************************/
typedef struct
{
	int blockflag;
	int windowtype;
	int transformtype;
	int mapping;
} vorbis_info_mode;

typedef void vorbis_info_floor;
typedef void vorbis_info_residue;
typedef void vorbis_info_mapping;

#include "psy.h"
#include "bitrate.h"

typedef struct private_state
{
	/* local lookup storage */
	envelope_lookup*        ve; /* envelope lookup */
	int                     window[2];
	vorbis_look_transform** transform[2];    /* block, type */
	drft_lookup             fft_look[2];

	int                     modebits;
	vorbis_look_floor**     flr;
	vorbis_look_residue**   residue;
	vorbis_look_psy*        psy;
	vorbis_look_psy_global* psy_g_look;

	/* local storage, only used on the encoding side.  This way the
	   application does not need to worry about freeing some packets'
	   memory and not others'; packet storage is always tracked.
	   Cleared next call to a _dsp_ function */
	unsigned char* header;
	unsigned char* header1;
	unsigned char* header2;

	bitrate_manager_state bms;

	ogg_int64_t sample_count;
} private_state;

/* codec_setup_info contains all the setup information specific to the
   specific compression/decompression mode in progress (eg,
   psychoacoustic settings, channel setup, options, codebook
   etc).
*********************************************************************/

#include "highlevel.h"
typedef struct codec_setup_info
{

	/* Vorbis supports only short and long blocks, but allows the
	   encoder to choose the sizes */

	long blocksizes[2];

	/* modes are the primary means of supporting on-the-fly different
	   blocksizes, different channel mappings (LR or M/A),
	   different residue backends, etc.  Each mode consists of a
	   blocksize flag and a mapping (along with the mapping setup */

	int        modes;
	int        maps;
	int        floors;
	int        residues;
	int        books;
	int        psys;     /* encode only */

	vorbis_info_mode*       mode_param[64];
	int                     map_type[64];
	vorbis_info_mapping*    map_param[64];
	int                     floor_type[64];
	vorbis_info_floor*      floor_param[64];
	int                     residue_type[64];
	vorbis_info_residue*    residue_param[64];
	static_codebook*        book_param[256];
	codebook*               fullbooks;

	vorbis_info_psy*        psy_param[4]; /* encode only */
	vorbis_info_psy_global psy_g_param;

	bitrate_manager_info   bi;
	highlevel_encode_setup hi; /* used only by vorbisenc.c.  It's a
                                highly redundant structure, but
                                improves clarity of program flow. */
	int         halfrate_flag; /* painless downsample for decode */
} codec_setup_info;

extern vorbis_look_psy_global* _vp_global_look( vorbis_info* vi );
extern void _vp_global_free( vorbis_look_psy_global* look );

#endif

